﻿using System;

namespace StockSharp.AlfaDirect.Tables
{
    /// <summary>
    /// Описывает подписчика на таблицу.
    /// Подписчик имеет фильтр на данные. Он хочет получать только определенные данные а не все.
    /// Подписчик имеет обработчик данных, который нужно вызывать для обработки отфильтрованных данных.
    /// </summary>
    public class Subscriber
    {
        readonly string _id;
        readonly FilterRules _where;
        readonly Action<TableData > _processor;

        /// <summary>
        /// Строковый идентификатор Подписчика. Служит для простой идентификации подписчика.
        /// </summary>
        public string ID
        {
            get { return _id; }
        }
        /// <summary>
        /// Фильтр по которому необходимо фильтровать данные перед передачей в Processor.
        /// Фильтр - это просто набор правил типо paper_code="SBER3", acc_code="1234-000"
        /// Все правила буду применяться последовательно к данным, и останутся только данные которые подходят под все правила.
        /// </summary>
        public FilterRules Where
        {
            get { return _where; }
        }
        /// <summary>
        /// Обработчик данных таблицы. В него передается содержимое в виде списка словарей key=field_name, value=field_value
        /// Каждый словарь в наборе, представляет собой одну строку таблицы.
        /// </summary>
        public Action<TableData> Processor
        {
            get { return _processor; }
        }

        /// <summary>
        /// Конструктор класса.
        /// </summary>
        /// <param name="id">Идентификатор подписчика. По идее должен быть уникальным. По идентификатору можно в будущем найти и удалить подписчик.</param>
        /// <param name="where"> содержащий правила для фильтрации данных. Может содержать 0 элементов, тогда подразумевается что правил нет.</param>
        /// <param name="processor">Метод подписчика который вызывается для обработки данных передваемых в подписку. Метод обязательно должен быть определен.</param>
        public Subscriber(string id, FilterRules where, Action<TableData> processor)
        {
            if (string.IsNullOrWhiteSpace(id))
                throw new ArgumentNullException("id", "Аргумент id не должен быть пустой строкой.");

            if (where == null)
                throw new ArgumentNullException("where", "Аргумент where может содержать 0 элементов, но не может быть null");

            if (processor == null)
                throw new ArgumentNullException("processor", "Аргумент processor не может быть null");

            _id = id;
            _where = where;
            _processor = processor;
        }
    }
}
